//
// Created by QU on 24-6-23.
//
#include <iostream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <new>
#include <thread>
#include <algorithm>
#include <array>
#include <string>
#include <deque>

using std::cout, std::cin, std::endl;

int main(int argc, const char* argv[])
{
    // 聚合类型（Aggregate Type）是C++中的一种特殊类型，它在C++17和C++20中有不同的定义和用途。
    // 理解聚合类型对于编写简洁、高效和可维护的代码非常重要。以下是聚合类型的定义及其在C++17和C++20中的作用：
    // 聚合类型在C++中是一种简洁、高效的数据结构，适用于简单的数据存储和传输场景。在使用聚合类型时，需要注意它们的初始化方式、访问权限、继承关系等特性

    // 在标准库<type_traits>中提供了一个聚合类型的甄别办法is_aggregate，它可以帮助我们判断目标类型是否为聚合类型

    class MyString : public std::string
    {
    };

    {
        std::cout << "std::is_aggregate_v<std::string> = "
            << std::is_aggregate_v<std::string> << std::endl;
        std::cout << "std::is_aggregate_v<MyString> = "
            << std::is_aggregate_v<MyString> << std::endl;
    }

    /**
        C++17中的聚合类型
        在C++17中，聚合类型的定义如下：

        没有用户定义的构造函数（包括默认构造函数、复制构造函数和移动构造函数）。
        没有私有或保护的非静态数据成员。
        没有虚函数。
        没有基类（即不能是继承自其他类的类）。
        这些条件决定了聚合类型是一种简单的数据结构，类似于C语言中的struct，可以直接进行初始化列表初始化。

        初始化列表初始化：聚合类型可以通过花括号直接初始化。例如：
        */

    struct Point
    {
        int x;
        int y;
    };

    Point p = {1, 2}; // 直接初始化
    // 简化代码：使用聚合类型可以减少代码的复杂性，因为不需要编写构造函数。

    // 性能：由于没有用户定义的构造函数，编译器可以对聚合类型进行更多的优化。

    ///////////////////////////////////////////////////////////////////////

    /**
    C++20中的聚合类型
    在C++20中，聚合类型的定义有所放宽，增加了以下特性：

    可以有基类，但这些基类也必须是聚合类型。
    可以有默认的构造函数。
    允许包含私有或保护的非静态数据成员，但这些成员不能在初始化列表中初始化。
    可以有虚函数。
    这些变化使得聚合类型更灵活，能够支持更多的用例。

    增强的初始化列表初始化：在C++20中，可以初始化更多类型的聚合类型，包括有默认构造函数和基类的情况。
    */

    struct Base
    {
        int a;
    };

    struct Derived : Base
    {
        int b;
    };

    Derived d = {{1}, 2}; // 基类和派生类都初始化
    // 简化继承结构：通过允许基类，聚合类型可以更好地支持简单的继承结构。
    // 更多优化机会：由于编译器能够更好地理解聚合类型的结构，可以进行更多的优化。


    // 总结
    // 聚合类型在C++17和C++20中都提供了简化数据结构初始化和管理的方式。
    // 在C++17中，它们是非常简单的数据结构，适用于没有复杂构造和继承需求的场景。
    // 在C++20中，聚合类型变得更加灵活，可以支持更复杂的类型和继承关系，同时仍然保持其简洁性和高效性。这些特性使得聚合类型在现代C++编程中具有重要的作用。
    return 0;
}
